﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Text.RegularExpressions;

namespace MetaEdit
{
	// TODO: refactor
	public partial class Replace : Window
	{
		public Replace()
		{
			InitializeComponent();
			//this.Background = Editor.backgroundBrush;
			this.Foreground = Brushes.White;
			this.Close.Click+=new RoutedEventHandler(Close_Click);
			//this.Background = Editor.backgroundBrush;
			this.Foreground = Brushes.White;
		}
		private void AddComboBoxTextToItems(ComboBox comboBox)
		{
			if (comboBox.Text != "")
			{
				if (!comboBox.Items.Contains(comboBox.Text))
				{
					comboBox.Items.Insert(0, comboBox.Text);
				}
				if (comboBox.Items.Count > 10)
				{
					comboBox.Items.RemoveAt(comboBox.Items.Count - 1);
				}
			}
		}

		private int initialFindPosition = 0;
		private bool passedEndOfDocument = false;
		//private void findWhat_TextChanged(object sender, System.EventArgs e)
		//{
		//    initialFindPosition = textBox.SelectionStart;
		//    passedEndOfDocument = false;
		//    bool isEnabled;
		//    if (findWhat.Text.Length == 0)
		//    {
		//        isEnabled = false;
		//    }
		//    else
		//    {
		//        isEnabled = true;
		//    }
		//    findNext.Enabled = isEnabled;
		//    replace.Enabled = isEnabled;
		//    replaceAll.Enabled = isEnabled;
		//}
		int CountStringOccurences(string subString, string text)
		{
			int count = 0;
			int index = 0;
			while (true)
			{
				index = text.IndexOf(subString, index);
				if (index != -1)
				{
					index += subString.Length;
					count++;
				}
				else
				{
					break;
				}
			}
			return count;
		}
		private void Close_Click(object sender, System.EventArgs e)
		{			
			Hide();
		}

		private void ReplaceDialog_Closing(object sender, System.ComponentModel.CancelEventArgs e)
		{
			Hide();
			e.Cancel = true;
		}
		public static Box textBox
		{
			get
			{
				return ((MetaEdit.Editor.Page)MetaEdit.Editor.editor.tabs.SelectedItem).textBox;
				//return ((MetaDevelop.Editor.Page)MetaDevelop.Editor.tabs.SelectedItem).textBox;
			}
		}
		private void next_Click(object sender, RoutedEventArgs e)
		{
			AddComboBoxTextToItems(find);
			AddComboBoxTextToItems(replace);
			int p = textBox.SelectionStart+textBox.SelectionLength;
			int newPosition=textBox.Text.IndexOf(find.Text, p, StringComparison.CurrentCultureIgnoreCase);
			if (newPosition != -1)
			{
				textBox.Select(newPosition,find.Text.Length);
				textBox.ScrollToCursor();//.Select(newPosition, find.Text.Length);
				MetaEdit.Editor.editor.Focus();
			}
		}
		private void replaceNext_Click(object sender, RoutedEventArgs e)
		{
			if (string.Compare(textBox.SelectedText, find.Text, !(bool)matchCase.IsChecked) == 0)
			{
				textBox.SelectedText = replace.Text;
			}
			next_Click(sender, null);
		}
		private void replaceAll_Click(object sender, RoutedEventArgs e)
		{
			int count = 0;
			textBox.Text = Regex.Replace(textBox.Text, find.Text, new MatchEvaluator(s => { count++; return replace.Text; }), RegexOptions.IgnoreCase);
			MessageBox.Show("Replaced " + count + " occurences.", Editor.ProgramName);
		}
		private void Close_Click(object sender, RoutedEventArgs e)
		{

		}

		private void Window_KeyDown(object sender, KeyEventArgs e)
		{
			if (e.Key == Key.Escape)
			{
				this.Hide();
			}
		}

		private void Window_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
		{
			if (this.IsVisible)
			{
				if (textBox.SelectedText != "")
				{
					find.Text = textBox.SelectedText;
				}
			}
		}

		private void Window_Initialized(object sender, EventArgs e)
		{
		}

		private void Window_Loaded(object sender, RoutedEventArgs e)
		{
			find.Focus();
		}

		private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
		{
			e.Cancel = true;
			Visibility = Visibility.Hidden;
		}
	}
}
//namespace IDE
//{
//    /// <summary>
//    /// Interaction logic for Replace.xaml
//    /// </summary>
//    public partial class Replace : Window
//    {
//        private RichTextBox textBox;
//        public Replace(RichTextBox textBox)
//        {
//            InitializeComponent();
//            this.textBox = textBox;
//        }

//        private void AddComboBoxTextToItems(ComboBox comboBox)
//        {
//            if (comboBox.Items.Contains(comboBox.Text))
//            {
//                comboBox.Items.Insert(0, comboBox.Text);
//            }
//            if (comboBox.Items.Count > 10)
//            {
//                comboBox.Items.RemoveAt(comboBox.Items.Count - 1);
//            }
//        }

//        private int initialFindPosition = 0;
//        private bool passedEndOfDocument = false;
//        //private void findWhat_TextChanged(object sender, System.EventArgs e)
//        //{
//        //    initialFindPosition = textBox.SelectionStart;
//        //    passedEndOfDocument = false;
//        //    bool isEnabled;
//        //    if (findWhat.Text.Length == 0)
//        //    {
//        //        isEnabled = false;
//        //    }
//        //    else
//        //    {
//        //        isEnabled = true;
//        //    }
//        //    findNext.Enabled = isEnabled;
//        //    replace.Enabled = isEnabled;
//        //    replaceAll.Enabled = isEnabled;
//        //}

//        //		private int Find()
//        //		{
//        ////			found=true;
//        //			RichTextBoxFinds findOptions=RichTextBoxFinds.MatchCase;
//        ////			if(matchCase.Checked)
//        ////			{
//        ////				findOptions|=RichTextBoxFinds.MatchCase;
//        ////			}
//        //
//        //			int searchStart;
//        //			searchStart=textBox.SelectionStart+textBox.SelectionLength;
//        //			int findPosition=textBox.Find(findWhat.Text,searchStart,findOptions);
//        //			if(findPosition==-1)
//        //			{
//        //				searchStart=0; // continue search at the start of the document
//        //				passedEndOfDocument=true;
//        //				findPosition=textBox.Find(findWhat.Text,searchStart,findOptions);
//        ////				if(findPosition==-1)
//        ////				{
//        ////					found=false;
//        ////				}
//        //			}
//        //			return findPosition;
//        //		}
//        //		private void Replace()
//        //		{
//        ////			bool ignoreCase=!matchCase.Checked;
//        ////			int compared=String.Compare(textBox.SelectedText,findWhat.Text,ignoreCase);
//        //			if(textBox.SelectedText==findWhat.Text)
//        //			{
//        //				textBox.SelectedText=replaceWith.Text;
//        //			}
//        ////			bool ignoreCase=!matchCase.Checked;
//        ////			int compared=String.Compare(textBox.SelectedText,findWhat.Text,ignoreCase);
//        ////			if(compared==0)
//        ////			{
//        ////				textBox.SelectedText=replaceWith.Text;
//        ////			}
//        //		}
//        //		private void findNext_Click(object sender, System.EventArgs e)
//        //		{
//        //			AddComboBoxTextToItems(findWhat);
//        //			AddComboBoxTextToItems(replaceWith);
//        //			int foundPosition=Find();
//        //			if(foundPosition==-1)
//        //			{
//        //				ShowMessageBox("The specified text could not be found.");
//        //			}
//        //		}

//        //private void findNext_Click(object sender, System.EventArgs e)
//        //{
//        //    //			if(findWhat.FindStringExact(findWhat.Text)==-1)
//        //    //			{
//        //    AddComboBoxTextToItems(find);
//        //    //findWhat.Items.Insert(0,findWhat.Text);
//        //    //			}
//        //    //			if(replaceWith.FindStringExact(replaceWith.Text)==-1)
//        //    //			{
//        //    AddComboBoxTextToItems(replace);
//        //    //replaceWith.Items.Insert(0,replaceWith.Text);
//        //    //			}

//        //    //RichTextBoxFinds findOptions = RichTextBoxFinds.MatchCase;

//        //    ////			if(searchUp.Checked)
//        //    ////			{
//        //    ////				findOptions|=RichTextBoxFinds.Reverse;
//        //    ////			}
//        //    ////			if(matchCase.Checked)
//        //    ////			{
//        //    ////				findOptions|=RichTextBoxFinds.MatchCase;
//        //    ////			}
//        //    //int searchStart;
//        //    ////			if(searchUp.Checked)
//        //    ////			{
//        //    ////				searchStart=textBox.SelectionStart-1;
//        //    ////			}
//        //    ////			else
//        //    ////			{
//        //    //searchStart = textBox.SelectionStart + textBox.SelectionLength;
//        //    ////			}
//        //    //int findPosition = textBox.Text.IndexOf(findWhat.Text, searchStart);//, findOptions);
//        //    ////int findPosition = textBox.Find(findWhat.Text, searchStart, findOptions);
//        //    ////int findPosition = textBox.Find(findWhat.Text, searchStart, findOptions);
//        //    //if (findPosition == -1)
//        //    //{
//        //    //    //				if(searchUp.Checked)
//        //    //    //				{
//        //    //    //					searchStart=textBox.Text.Length;
//        //    //    //				}
//        //    //    //				else
//        //    //    //				{
//        //    //    searchStart = 0;
//        //    //    //				}
//        //    //    findPosition = textBox.Text.IndexOf(findWhat.Text, searchStart);//, findOptions);
//        //    //    //findPosition = textBox.Find(findWhat.Text, searchStart, findOptions);
//        //    //    if (findPosition == -1)
//        //    //    {
//        //    //        ShowMessageBox("The specified text could not be found.");
//        //    //    }
//        //    //    //				MessageBox.Show("The specified text could not be found.");
//        //    //}
//        //    //if (findPosition != -1)
//        //    //{
//        //    //    textBox.SelectionStart = findPosition;// = textBox.Find(findWhat.Text, textBox.SelectionStart, RichTextBoxFinds.None);
//        //    //    textBox.SelectionLength = findWhat.Text.Length;
//        //    //}
//        //}
//        private void replace_Click(object sender, System.EventArgs e)
//        {
//            //			bool ignoreCase=!matchCase.Checked;
//            //			int compared=String.Compare(textBox.SelectedText,findWhat.Text,ignoreCase);
//            if (textBox.Selection.Text == find.Text)
//            {
//                textBox.Selection.Text = replace.Text;
//            }
//            //			Replace();
//            //			Find();
//            next_Click(sender, null);
//        }
//        int CountStringOccurences(string subString, string text)
//        {
//            int count = 0;
//            int index = 0;
//            while (true)
//            {
//                index = text.IndexOf(subString, index);
//                if (index != -1)
//                {
//                    index += subString.Length;
//                    count++;
//                }
//                else
//                {
//                    break;
//                }
//            }
//            return count;
//        }
//        //private void ShowMessageBox(string text)
//        //{
//        //    MessageBox.Show(this.FindForm(), text, "Meta Editor", MessageBoxButtons.OK, MessageBoxIcon.Information);
//        //}
//        private void close_Click(object sender, System.EventArgs e)
//        {
//            Hide();
//        }

//        private void ReplaceDialog_Closing(object sender, System.ComponentModel.CancelEventArgs e)
//        {
//            Hide();
//            e.Cancel = true;
//        }
//        private void next_Click(object sender, RoutedEventArgs e)
//        {
//            //			if(findWhat.FindStringExact(findWhat.Text)==-1)
//            //			{
//            AddComboBoxTextToItems(find);
//            //findWhat.Items.Insert(0,findWhat.Text);
//            //			}
//            //			if(replaceWith.FindStringExact(replaceWith.Text)==-1)
//            //			{
//            AddComboBoxTextToItems(replace);
//            //replaceWith.Items.Insert(0,replaceWith.Text);
//            //			}

//            //RichTextBoxFinds findOptions = RichTextBoxFinds.MatchCase;

//            ////			if(searchUp.Checked)
//            ////			{
//            ////				findOptions|=RichTextBoxFinds.Reverse;
//            ////			}
//            ////			if(matchCase.Checked)
//            ////			{
//            ////				findOptions|=RichTextBoxFinds.MatchCase;
//            ////			}
//            //int searchStart;
//            ////			if(searchUp.Checked)
//            ////			{
//            ////				searchStart=textBox.SelectionStart-1;
//            ////			}
//            ////			else
//            ////			{
//            //searchStart = textBox.SelectionStart + textBox.SelectionLength;
//            ////			}
//            //int findPosition = textBox.Text.IndexOf(findWhat.Text, searchStart);//, findOptions);
//            ////int findPosition = textBox.Find(findWhat.Text, searchStart, findOptions);
//            ////int findPosition = textBox.Find(findWhat.Text, searchStart, findOptions);
//            //if (findPosition == -1)
//            //{
//            //    //				if(searchUp.Checked)
//            //    //				{
//            //    //					searchStart=textBox.Text.Length;
//            //    //				}
//            //    //				else
//            //    //				{
//            //    searchStart = 0;
//            //    //				}
//            //    findPosition = textBox.Text.IndexOf(findWhat.Text, searchStart);//, findOptions);
//            //    //findPosition = textBox.Find(findWhat.Text, searchStart, findOptions);
//            //    if (findPosition == -1)
//            //    {
//            //        ShowMessageBox("The specified text could not be found.");
//            //    }
//            //    //				MessageBox.Show("The specified text could not be found.");
//            //}
//            //if (findPosition != -1)
//            //{
//            //    textBox.SelectionStart = findPosition;// = textBox.Find(findWhat.Text, textBox.SelectionStart, RichTextBoxFinds.None);
//            //    textBox.SelectionLength = findWhat.Text.Length;
//            //}
//        }

//        private void replaceNext_Click(object sender, RoutedEventArgs e)
//        {

//        }

//        private void replaceAll_Click(object sender, RoutedEventArgs e)
//        {
//            //int selectionStart = textBox.SelectionStart;
//            //int occurences = CountStringOccurences(findWhat.Text, textBox.Text);
//            //textBox.Text = textBox.Text.Replace(findWhat.Text, replaceWith.Text);
//            //textBox.SelectionStart = selectionStart;
//            //ShowMessageBox(occurences.ToString() + " occurence(s) replaced.");
//        }
//        private void Close_Click(object sender, RoutedEventArgs e)
//        {

//        }

//        private void Window_KeyDown(object sender, KeyEventArgs e)
//        {
//            if (e.Key == Key.Escape)
//            {
//                this.Hide();
//            }
//        }

//        private void Window_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
//        {
//            if (this.IsVisible)
//            {
//                if (textBox.Selection.Text != "")
//                {
//                    find.Text = textBox.Selection.Text;
//                }
//            }
//        }
//    }
//}